package com.gill.demo;

import lombok.Data;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

/**
 *
 * @Description: zookeeper 同步异步删除zk节点demo演示
 */
@Data
public class ZKNodeDelete implements Watcher {

    private ZooKeeper zookeeper = null;

    public static final String zkServerPath = "env:2181";
    public static final Integer timeout = 5000;

    public ZKNodeDelete() {}

    public ZKNodeDelete(String connectString) {
        try {
            zookeeper = new ZooKeeper(connectString, timeout, new ZKNodeDelete());
        } catch (IOException e) {
            e.printStackTrace();
            if (zookeeper != null) {
                try {
                    zookeeper.close();
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    @Override
    public void process(WatchedEvent event) {
        // 连接成功后，连接时间触发，本次测试不做处理，所以采用空实现
    }

    public static void main(String[] args) throws Exception {
        // 建立连接，创建客户端
        ZKNodeDelete zkServer = new ZKNodeDelete(zkServerPath);

        /**
         * 参数：
         * path：节点路径
         * version：数据状态
         */
        // 前提条件：到zk服务端创建一个节点用来做删除测试
        // 同步删除：不推荐（没有任何提示）
//		zkServer.getZookeeper().delete("/test-delete-node", 0);

        // 前提条件：到zk服务端创建一个节点用来做删除测试
        // 异步删除：推荐（用户可以通过回调函数判断是否删除成功）
        String ctx = "{'delete':'success'}";
        zkServer.getZookeeper().delete("/test-delete-node", 0,new DeleteCallBack(), ctx);
        Thread.sleep(2000);//确保回调函数能够被执行
    }

    /**
     * 修改节点成功后，会自动获取节点的一些信息，执行processResult方法
     */
    static class DeleteCallBack implements AsyncCallback.VoidCallback {

        @Override
        public void processResult(int rc, String path, Object ctx) {
            System.out.println("删除节点: " + path);
            System.out.println((String)ctx);
        }
    }
}
